React์ experimental_useActionState ํ ์ ์ดํด๋ณด์ธ์. React ์ ํ๋ฆฌ์ผ์ด์ ์์ ์๋ฒ ์ํ ๋ฐ ์ ์ธ์ ๋ณ๊ฒฝ ์ฌํญ์ ๊ด๋ฆฌํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ์๋ก์ด ๋๊ตฌ์ ๋๋ค.
์ ์ธ์ ๋ณ๊ฒฝ ์ฌํญ ์ ๊ธ ํด์ : React์ experimental_useActionState ํ ์ฌ์ธต ๋ถ์
ํ๋ฐํธ ์๋ ๊ฐ๋ฐ์ ๋์์์ด ์งํํ๋ ํ๊ฒฝ์์ ์๋ฒ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ณ ๋น๋๊ธฐ ๋ณ๊ฒฝ ์ฌํญ์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. React์ ์ง์์ ์ธ ํ์ ์ ์ด๋ฌํ ๋ณต์กํ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ํํ ์ ์๋ ์๋ก์ด ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ์ ๋งํ ์ถ๊ฐ ๊ธฐ๋ฅ ์ค ํ๋๋ experimental_useActionState ํ ์ ๋๋ค. ์ด ํ ์ ์์ง ์คํ ๋จ๊ณ์ ์์ง๋ง ์๋ฒ ๋ณ๊ฒฝ ์ฌํญ ๋ฐ ์ ์ธ์ UI ์ ๋ฐ์ดํธ์ ๊ด๋ จ๋ ์๋๋ฆฌ์ค์์ ํนํ ์ก์ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ์๋ก์ด ์ ๊ทผ ๋ฐฉ์์ ์ ๊ณตํฉ๋๋ค. ์ด ํฌ๊ด์ ์ธ ๊ฐ์ด๋์์๋ ์ ์ฌ๋ ฅ, ์ค์ ์์ฉ ํ๋ก๊ทธ๋จ ๋ฐ ์ ์ธ๊ณ ๊ฐ๋ฐ์์๊ฒ ์ด๋ป๊ฒ ๋์์ด ๋๋์ง ์ดํด๋ด ๋๋ค.
๋ ๋์ ๋ณ๊ฒฝ ์ฌํญ ์ฒ๋ฆฌ์ ๋ํ ํ์์ฑ ์ดํด
React์์ ๋ณ๊ฒฝ ์ฌํญ์ ๊ด๋ฆฌํ๋ ๊ธฐ์กด ์ ๊ทผ ๋ฐฉ์์ ์ข ์ข ๋ณต์กํ ์ํ ๊ด๋ฆฌ ํจํด์ ํฌํจํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ์์ ์ ์ถ, ๋ ์ฝ๋ ์ ๋ฐ์ดํธ ๋๋ ํญ๋ชฉ ์ญ์ ์ ๊ฐ์ด ์๋ฒ์ ์ํธ ์์ฉํ๋ ์์ ์ ์์ํ๋ฉด ์ฌ๋ฌ ์ํ๋ฅผ ๊ด๋ฆฌํด์ผ ํฉ๋๋ค.
- ๋ณด๋ฅ ์ค ์ํ: ๋ณ๊ฒฝ ์ฌํญ์ด ์งํ ์ค์์ ๋ํ๋ด๋ฉฐ ๋ก๋ฉ ์คํผ๋๋ฅผ ํ์ํ๊ฑฐ๋ ๋ํํ ์์๋ฅผ ๋นํ์ฑํํ๋ ๋ฐ ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค.
- ์ฑ๊ณต ์ํ: ๋ณ๊ฒฝ ์ฌํญ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋์์์ ๋ํ๋ด๋ฉฐ UI ์ ๋ฐ์ดํธ, ์ฑ๊ณต ๋ฉ์์ง ๋๋ ํ์์ ํ์ฉํฉ๋๋ค.
- ์ค๋ฅ ์ํ: ๋ณ๊ฒฝ ์ฌํญ ์ค์ ๋ฐ์ํ ๋ฌธ์ ๋ฅผ ์บก์ฒํ์ฌ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ํ์ํ๊ณ ์ฌ์๋ ์ต์ ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ: ์ ํ๋ฆฌ์ผ์ด์ ์ํ์ ํตํฉํด์ผ ํ ์ ์๋ ์ฑ๊ณต์ ์ธ ๋ณ๊ฒฝ ์ฌํญ์ ๊ฒฐ๊ณผ์ ๋๋ค.
ํนํ ์ฌ๋ฌ ๊ตฌ์ฑ ์์ ๋๋ ๋ณต์กํ ์์์์ ์ด๋ฌํ ์ํ๋ฅผ ์๋์ผ๋ก ์ค์ผ์คํธ๋ ์ด์ ํ๋ฉด ์ฅํฉํ๊ณ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฌ์ด ์ฝ๋๋ก ์ด์ด์ง ์ ์์ต๋๋ค. experimental_useActionState์ ๊ฐ์ ํ ์ ์ด๋ฌํ ๋น๋๊ธฐ ์์ ์ ์ฒ๋ฆฌํ๋ ๋ณด๋ค ์ ์ธ์ ์ด๊ณ ์ผ๊ด๋ ๋ฐฉ์์ ์ ๊ณตํ์ฌ ๊ฐ๋ฐ์ ๊ฒฝํ์ ๋จ์ํํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค.
experimental_useActionState ์๊ฐ
experimental_useActionState ํ ์ ์๋ฒ ๋ณ๊ฒฝ๊ณผ ๊ฐ์ ๋น๋๊ธฐ ์์ ์ ๊ฒฐ๊ณผ๋ก ๋ฐ์ํ๋ ์ํ ์ ํ ๊ด๋ฆฌ๋ฅผ ๋จ์ํํ๋๋ก ์ค๊ณ๋์์ต๋๋ค. ๋ณธ์ง์ ์ผ๋ก ์์ ์์๊ณผ ๊ฒฐ๊ณผ ์ํ ๊ด๋ฆฌ๋ฅผ ๋ถ๋ฆฌํ์ฌ ๋ ๊ตฌ์กฐํ๋๊ณ ์์ธก ๊ฐ๋ฅํ ํจํด์ ์ ๊ณตํฉ๋๋ค.
ํต์ฌ์ ์ผ๋ก experimental_useActionState๋ ๋น๋๊ธฐ ํจ์(์ข
์ข
'์ก์
'์ด๋ผ๊ณ ํจ)๋ฅผ ์ฌ์ฉํ๊ณ ๋ค์์ ํฌํจํ๋ ํํ์ ๋ฐํํฉ๋๋ค.
- ํ์ฌ ์ํ: ์ด๋ ๋ง์ง๋ง์ผ๋ก ์คํ๋ ์์ ์ ๊ฒฐ๊ณผ๋ฅผ ๋ํ๋ ๋๋ค.
- ๋์คํจ์น ํจ์: ์ด ํจ์๋ ํ์ํ ์ธ์๋ฅผ ์ ๋ฌํ์ฌ ์์ ์ ํธ๋ฆฌ๊ฑฐํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
ํ ์ ์ฌ์ฉํ๋ฉด ์์ ์ ์์์ ์ ์ค์ ํ๋ ๋ฐ ์ค์ํ ์ด๊ธฐ ์ํ๋ฅผ ์ ์ํ ์๋ ์์ต๋๋ค.
์ฃผ์ ๊ฐ๋ ๋ฐ ์ด์
experimental_useActionState๊ฐ ์ ๊ณตํ๋ ํต์ฌ ์ด์ ๊ณผ ๊ฐ๋
์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
1. ์ ์ธ์ ์ํ ๊ด๋ฆฌ
์์
๊ฒฐ๊ณผ์ ๋ฐ๋ผ ์ํ๋ฅผ ๋ช
๋ น์ ์ผ๋ก ์
๋ฐ์ดํธํ๋ ๋์ experimental_useActionState๋ ์ ์ธ์ ์ ๊ทผ ๋ฐฉ์์ ์ฅ๋ คํฉ๋๋ค. ๊ฐ๋ฅํ ์ํ์ ํด๋น ์ํ์ ๋๋ฌํ๋ ๋ฐฉ๋ฒ์ ์ ์ํ๋ฉด ํ
์ด ์ ํ์ ์ฒ๋ฆฌํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ฝ๋๋ฅผ ๋ ์ฝ๊ธฐ ์ฝ๊ณ ์ ์ง ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
2. ๊ฐ์ํ๋ ๋ณด๋ฅ, ์ฑ๊ณต ๋ฐ ์ค๋ฅ ์ํ
ํ ์ ๋น๋๊ธฐ ์์ ๊ณผ ๊ด๋ จ๋ ๋ณด๋ฅ, ์ฑ๊ณต ๋ฐ ์ค๋ฅ ์ํ๋ฅผ ๋ณธ์ง์ ์ผ๋ก ๊ด๋ฆฌํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ด๋ฌํ ์ํ๋ฅผ ์๋์ผ๋ก ์ถ์ ํ๋ ๋ฐ ์ผ๋ฐ์ ์ผ๋ก ํ์ํ ์์ฉ๊ตฌ ์ฝ๋๊ฐ ์ ๊ฑฐ๋ฉ๋๋ค. ์ต์ ์ํ์ ์ง์ ์ก์ธ์คํ์ฌ UI๋ฅผ ์กฐ๊ฑด๋ถ๋ก ๋ ๋๋งํ ์ ์์ต๋๋ค.
3. ์๋ฒ ๋ณ๊ฒฝ ์ฌํญ๊ณผ์ ์ํํ ํตํฉ
์ด ํ
์ ์๋ฒ ์ํธ ์์ฉ๊ณผ ๊ด๋ จ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๊ด๋ฆฌํ๋ ๋ฐ ํนํ ์ ํฉํฉ๋๋ค. ์ฌ์ฉ์ ํ๋กํ ์
๋ฐ์ดํธ, ์ฃผ๋ฌธ ์ ์ถ ๋๋ ๋ฐ์ดํฐ ์ญ์ ๋ฑ experimental_useActionState๋ ์ด๋ฌํ ์์
์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ํจํด์ ์ ๊ณตํฉ๋๋ค.
4. ํฅ์๋ ์์ ์ฒ๋ฆฌ
์์์ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ฐ์ํ๋ ์ฃผ์ ์์ญ์
๋๋ค. experimental_useActionState๋ ์์ ์ ์ถ ๋ก์ง์ ํฌ๊ฒ ๋จ์ํํ ์ ์์ต๋๋ค. ์์
์ ํ์ฌ ์ํ์ ๋ฐ๋ผ ๋ก๋ฉ ํ์๊ธฐ, ์ฑ๊ณต ๋ฉ์์ง ๋๋ ์ค๋ฅ ์๋ฆผ์ ์ฝ๊ฒ ํ์ํ ์ ์์ต๋๋ค.
5. React Server Components(RSC) ์๋์ง
experimental_useActionState์ ๊ฐ๋ฐ์ React Server Components์ ๋ฐ์ ๊ณผ ๋ฐ์ ํ๊ฒ ๊ด๋ จ๋์ด ์์ต๋๋ค. RSC์์ ์ง์ ์์ ์ ์ถ์ ์๋ฒ ์์
์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ผ๋ฉฐ experimental_useActionState๋ ์ด๋ฌํ ์๋ฒ ๊ธฐ๋ฐ ์์
์ ๊ฒฐ๊ณผ๋ก ๋ฐ์ํ๋ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ํด๋ผ์ด์ธํธ ์ธก ํ
์ญํ ์ ํ์ฌ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํ ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ์ ๊ฒฉ์ฐจ๋ฅผ ํด์ํฉ๋๋ค.
6. ํฅ์๋ ๊ฐ๋ฐ์ ๊ฒฝํ
๋ณต์กํ ์ํ ๊ด๋ฆฌ์ ์๋น ๋ถ๋ถ์ ์ถ์ํํจ์ผ๋ก์จ ํ ์ ํตํด ๊ฐ๋ฐ์๋ ๋น๋๊ธฐ ์ํ ๋๊ธฐํ์ ๋ณต์ก์ฑ์ด ์๋ ๋น์ฆ๋์ค ๋ก์ง ๋ฐ UI ํ๋ ์ ํ ์ด์ ์ ๋ ์ง์คํ ์ ์์ต๋๋ค. ์ด๋ ์์ฐ์ฑ ํฅ์์ ํฐ ๋์์ด ๋๋ฉฐ, ํนํ ํจ์จ์ ์ธ ๊ฐ๋ฐ์ด ์ค์ํ ๋๊ท๋ชจ ๊ตญ์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์์ ํ๋ ํ์๊ฒ ๋์ฑ ๊ทธ๋ ์ต๋๋ค.
experimental_useActionState ์ฌ์ฉ ๋ฐฉ๋ฒ
experimental_useActionState์ ์ฌ์ฉ๋ฒ์ ์ค์ ์๋ก ์ค๋ช
ํด ๋ณด๊ฒ ์ต๋๋ค.
๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ: ๊ฐ๋จํ ์นด์ดํฐ
experimental_useActionState๋ ์ฃผ๋ก ๋ ๋ณต์กํ ๋ณ๊ฒฝ ์ฌํญ์ ์ํด ์ค๊ณ๋์์ง๋ง ๊ฐ๋จํ ์นด์ดํฐ ์๋ ๊ธฐ๋ณธ ์๋ฆฌ๋ฅผ ์ค๋ช
ํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
import { experimental_useActionState } from 'react';
function incrementReducer(state, payload) {
return { count: state.count + payload };
}
function Counter() {
const [state, formAction] = experimental_useActionState(
async (prevState, formData) => {
const incrementBy = Number(formData.get('incrementBy')) || 1;
// Simulate an asynchronous operation
await new Promise(resolve => setTimeout(resolve, 500));
return incrementReducer(prevState, incrementBy);
},
{ count: 0 } // Initial state
);
return (
Count: {state.count}
{/* In a real scenario, you'd manage pending/error states here */}
);
}
์ด ์์ ์์๋:
- ์ํ ์
๋ฐ์ดํธ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฆฌ๋์ ํจ์
incrementReducer๋ฅผ ์ ์ํฉ๋๋ค. experimental_useActionState๋ ์ฆ๊ฐ ์์ ์ ์๋ฎฌ๋ ์ด์ ํ๋ ๋น๋๊ธฐ ํจ์์ ์ด๊ธฐ ์ํ{ count: 0 }์ผ๋ก ํธ์ถ๋ฉ๋๋ค.- ํ์ฌ
state์formAction์ ๋ฐํํฉ๋๋ค. formAction์ ์์์action์์ฑ์ ์ฒจ๋ถ๋ฉ๋๋ค. ์์์ด ์ ์ถ๋๋ฉด ๋ธ๋ผ์ฐ์ ์์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณต๋ ์์ ์ ์ ์ถํฉ๋๋ค.- ๋น๋๊ธฐ ํจ์๋ ์ด์ ์ํ์ ์์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ณ ์์ ์ ์ํํ๋ฉฐ ์ ์ํ๋ฅผ ๋ฐํํฉ๋๋ค.
์ํ ํ์๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ ์์ ์ ์ถ ๊ด๋ฆฌ
๋ ์ค์ฉ์ ์ธ ์ฌ์ฉ ์ฌ๋ก์๋ ์ฌ์ฉ์์๊ฒ ๋ช ํํ ์ํ ํผ๋๋ฐฑ์ ์ ๊ณตํ๋ ์์ ์ ์ถ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ํฌํจ๋ฉ๋๋ค. ์ฌ์ฉ์ ํ๋กํ ์ ๋ฐ์ดํธ ์์์ ์์ํด ๋ณด์ธ์.
import { experimental_useActionState } from 'react';
// Assume updateUserProfile is a function that interacts with your API
// It should return an object indicating success or failure.
async function updateUserProfile(prevState, formData) {
const name = formData.get('name');
const email = formData.get('email');
try {
// Simulate API call
const response = await fetch('/api/user/profile', {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name, email })
});
if (!response.ok) {
const errorData = await response.json();
throw new Error(errorData.message || 'Failed to update profile');
}
const updatedUser = await response.json();
return { message: 'Profile updated successfully!', user: updatedUser, error: null };
} catch (error) {
return { message: null, user: null, error: error.message };
}
}
function UserProfileForm({ initialUser }) {
const [state, formAction] = experimental_useActionState(
updateUserProfile,
{ message: null, user: initialUser, error: null } // Initial state
);
return (
Edit Profile
{state.message && {state.message}
}
{state.error && Error: {state.error}
}
);
}
์ด ๋ ๊ณ ๊ธ ์์ ์์๋:
updateUserProfileํจ์๋ API ํธ์ถ์ ์๋ฎฌ๋ ์ด์ ํฉ๋๋ค. ์ ์ฌ์ ์ธ API ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๊ณ ๊ตฌ์กฐํ๋ ์ํ ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.- ์ด๊ธฐ ์ํ์๋ ์ฌ์ฉ์ ๋ฐ์ดํฐ์ ๋ฉ์์ง ๋๋ ์ค๋ฅ๊ฐ ์์ต๋๋ค.
- ์์์ ํ
์์ ๋ฐํ๋
formAction์ ์ฌ์ฉํฉ๋๋ค. - ์กฐ๊ฑด๋ถ ๋ ๋๋ง์
state.message๋ฐstate.error๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฑ๊ณต ๋๋ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ํ์ํฉ๋๋ค. - ๋ฒํผ์ ํ
์คํธ์ ๋นํ์ฑํ ์ํ๋
state๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ ์ผ๋ก ์ ๋ฐ์ดํธ๋์ด ์งํ ์ค์ธ ์์ ์ ๋ํ ์ฆ๊ฐ์ ์ธ ํผ๋๋ฐฑ์ ์ฌ์ฉ์์๊ฒ ์ ๊ณตํฉ๋๋ค. API ํธ์ถ ์ค์ ๋ฒํผ์ ์ค์ ๋ก ๋นํ์ฑํํ๋ ค๋ฉด ๋ณด๋ค ๊ฐ๋ ฅํ ๋ณด๋ฅ ์ํ๋ฅผ ๊ด๋ฆฌํด์ผ ํฉ๋๋ค.
UI ํผ๋๋ฐฑ์ ์ํด ์ํ ํ์ฉ
experimental_useActionState์ ์ง์ ํ ํ์ ์์
์ ํ์ฌ ์ํ์ ๋ํด UI์ ์๋ฆด ์ ์๋ค๋ ๊ฒ์
๋๋ค. ์ด๋ ํนํ ๋คํธ์ํฌ ๋๊ธฐ ์๊ฐ์ด ํฌ๊ฒ ๋ฌ๋ผ์ง ์ ์๋ ๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์
์์ ๋ฐ์์ฑ์ด ๋ฐ์ด๋๊ณ ์ฌ์ฉ์ ์นํ์ ์ธ ํ๊ฒฝ์ ๋ง๋๋ ๋ฐ ์ค์ํฉ๋๋ค.
ํ ์์ ๋ฐํ๋ ์ํ๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์์ ์ํํ ์ ์์ต๋๋ค.
- ๋ก๋ฉ ํ์๊ธฐ ํ์: ์์ ์ด ๋ณด๋ฅ ์ค์ผ ๋ ์คํผ๋๋ฅผ ๋ ๋๋งํ๊ฑฐ๋ ์ ์ถ ๋ฒํผ์ ๋นํ์ฑํํฉ๋๋ค.
- ์ฑ๊ณต/์ค๋ฅ ๋ฉ์์ง ํ์: ์์ ์ ๊ฒฐ๊ณผ์ ๋ํด ์ฌ์ฉ์์๊ฒ ๋ช ํํ ํผ๋๋ฐฑ์ ์ ๊ณตํฉ๋๋ค.
- ์กฐ๊ฑด๋ถ ๋ ๋๋ง: ์์ ์ํ์ ๋ฐ๋ผ ๋ค๋ฅธ UI ์์๋ฅผ ํ์ํฉ๋๋ค(์: ์ญ์ ๊ฐ ์ฑ๊ณตํ ํ ํ์ธ ๋ฉ์์ง ํ์).
- ๋๊ด์ ์
๋ฐ์ดํธ:
experimental_useActionState๋ ๋๊ด์ ์ ๋ฐ์ดํธ๋ฅผ ์ง์ ๊ตฌํํ์ง ์์ง๋ง ์ํ ๊ด๋ฆฌ๋ ์ด๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํ ๊ธฐ๋ฐ์ด ๋ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด UI๋ฅผ ๋๊ด์ ์ผ๋ก ์ ๋ฐ์ดํธํ ๋ค์ ํ ์ ์ต์ข ์ํ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋๋๋ฆฌ๊ฑฐ๋ ํ์ธํ ์ ์์ต๋๋ค.
๊ณ ๊ธ ํจํด ๋ฐ ๊ณ ๋ ค ์ฌํญ
experimental_useActionState๋ฅผ ๋ ๋ณต์กํ ์๋๋ฆฌ์ค์ ํตํฉํ ๋ ๋ช ๊ฐ์ง ๊ณ ๊ธ ํจํด๊ณผ ๊ณ ๋ ค ์ฌํญ์ด ์ ์ฉ๋ฉ๋๋ค.
์ฌ๋ฌ ์์ ์ฒ๋ฆฌ
๊ตฌ์ฑ ์์์์ ์ฌ๋ฌ ๊ฐ์ ๋
๋ฆฝ์ ์ธ ๋น๋๊ธฐ ์์
์ ๊ด๋ฆฌํด์ผ ํ๋ ๊ฒฝ์ฐ experimental_useActionState๋ฅผ ์ฌ๋ฌ ๋ฒ ํธ์ถํ ์ ์์ผ๋ฉฐ ๊ฐ ์์
์๋ ์์ฒด ์์
๊ณผ ์ด๊ธฐ ์ํ๊ฐ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๊ฐ ์์
์ ๋ํ ์ํ ๊ด๋ฆฌ๊ฐ ๊ฒฉ๋ฆฌ๋ฉ๋๋ค.
function MultiActionComponent() {
// Action 1: Create item
const [createState, createFormAction] = experimental_useActionState(createItem, { message: null, item: null });
// Action 2: Delete item
const [deleteState, deleteFormAction] = experimental_useActionState(deleteItem, { message: null, success: false });
return (
{/* Form for creating item using createFormAction */}
{/* Form for deleting item using deleteFormAction */}
);
}
๊ธฐ์กด ์ํ ๊ด๋ฆฌ์์ ํตํฉ
experimental_useActionState๋ ํน์ ์์
์ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ ํ์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ ์ญ ์ ํ๋ฆฌ์ผ์ด์
์ํ ๋๋ ๋ ๋ณต์กํ ๊ตฌ์ฑ ์์ ๊ฐ ํต์ ์ ๊ฒฝ์ฐ Context API, Zustand ๋๋ Redux์ ๊ฐ์ ๋ค๋ฅธ ์ํ ๊ด๋ฆฌ ์๋ฃจ์
๊ณผ ํตํฉํด์ผ ํ ์ ์์ต๋๋ค.
experimental_useActionState์์ ๋ฐํ๋ ์ํ๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ญ ์ํ ๊ด๋ฆฌ ์์คํ
์์ ์
๋ฐ์ดํธ๋ฅผ ํธ๋ฆฌ๊ฑฐํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ฑ๊ณต์ ์ธ ๋ณ๊ฒฝ ์ ์ ์ญ ์คํ ์ด์ ์์
์ ๋์คํจ์นํ์ฌ ํญ๋ชฉ ๋ชฉ๋ก์ ์
๋ฐ์ดํธํ ์ ์์ต๋๋ค.
์ค๋ฅ ์ฒ๋ฆฌ ๋ฐ ์ฌ์๋ ๋ฉ์ปค๋์ฆ
๊ฐ๋ ฅํ ์ค๋ฅ ์ฒ๋ฆฌ๋ ์ฌ์ฉ์ ๊ฒฝํ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ํ ์ด ์ค๋ฅ ์ํ๋ฅผ ์ ๊ณตํ์ง๋ง ๋ ์ ๊ตํ ์ฌ์๋ ๋ก์ง์ ๊ตฌํํ ์ ์์ต๋๋ค.
- ์ฌ์๋ ๋ฒํผ: ์ฌ์ฉ์๊ฐ ๋์คํจ์น๋ ์์ ํจ์๋ฅผ ๋ค์ ํธ์ถํ๊ธฐ๋ง ํ๋ฉด ์คํจํ ์์ ์ ์ฌ์๋ํ ์ ์๋๋ก ํ์ฉํฉ๋๋ค.
- ์ง์ ๋ฐฑ์คํ: ์ค์ํ ์์ ์ ๊ฒฝ์ฐ ์๋ ๊ฐ์ ์ง์ฐ ์๊ฐ์ด ์ฆ๊ฐํ๋ ์ฌ์๋ ์ ๋ต์ ๊ตฌํํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค. ์ผ๋ฐ์ ์ผ๋ก ๊ธฐ๋ณธ ํ ์ฌ์ฉ๋ฒ ์ธ๋ถ์ ์ฌ์ฉ์ ์ง์ ๋ก์ง์ด ํฌํจ๋ฉ๋๋ค.
๊ตญ์ ํ(i18n) ๋ฐ ํ์งํ(l10n)์ ๋ํ ๊ณ ๋ ค ์ฌํญ
๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ํด ๊ตญ์ ํ ๋ฐ ํ์งํ๋ ํ์์ ์
๋๋ค. experimental_useActionState๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ:
- ์ค๋ฅ ๋ฉ์์ง: ์๋ฒ ์์ ์์ ๋ฐํ๋ ์ค๋ฅ ๋ฉ์์ง๊ฐ ํ์งํ๋์๋์ง ํ์ธํฉ๋๋ค. ๋ก์บ ์ ๋ณด๋ฅผ ์๋ฒ ์์ ์ ์ ๋ฌํ๊ฑฐ๋ ์ค๋ฅ ์ฝ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํด๋ผ์ด์ธํธ์์ ํ์งํ๋ ๋ฉ์์ง๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
- ์ฌ์ฉ์ ์ ๋ ฅ: ์์์๋ ์ข ์ข ๋ค๋ฅธ ํ์(์: ๋ ์ง, ์ซ์, ํตํ)์ ์ค์ํด์ผ ํ๋ ์ฌ์ฉ์ ์ ๋ ฅ์ด ํฌํจ๋ฉ๋๋ค. ์์ ์ ํจ์ฑ ๊ฒ์ฌ ๋ฐ ์๋ฒ ์ธก ์ฒ๋ฆฌ๊ฐ ์ด๋ฌํ ๋ณํ์ ๊ณ ๋ คํ๋์ง ํ์ธํ์ญ์์ค.
- ์๊ฐ๋: ์์ ์ ์์ฝ ๋๋ ํ์์คํฌํ๊ฐ ํฌํจ๋ ๊ฒฝ์ฐ ์๊ฐ๋๋ฅผ ์ผ๋์ ๋๊ณ ์๋ฒ์ UTC๋ก ๋ ์ง๋ฅผ ์ ์ฅํ๊ณ ํด๋ผ์ด์ธํธ์์ ์ฌ์ฉ์์ ํ์ง ์๊ฐ๋๋ก ๋ณํํฉ๋๋ค.
์ฑ๋ฅ ์ํฅ
๋ค๋ฅธ ์๋ก์ด ๊ธฐ๋ฅ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฑ๋ฅ์ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. experimental_useActionState๋ ์ํ ๊ด๋ฆฌ๋ฅผ ์ถ์ํํจ์ผ๋ก์จ ์ฌ๋ฐ๋ฅด๊ฒ ๊ด๋ฆฌํ๋ ๊ฒฝ์ฐ ๋ถํ์ํ ์ฌ ๋ ๋๋ง์ ๋ฐฉ์งํ์ฌ ๋ ๊นจ๋ํ๊ณ ์ฑ๋ฅ์ด ์ข์ ์ฝ๋๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ํ ๋ด์์ ๊ณผ๋ํ๊ฒ ๋น๋ฒํ ์ํ ์
๋ฐ์ดํธ ๋๋ ํฐ ๋ฐ์ดํฐ ํ์ด๋ก๋๋ ์ฌ์ ํ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค.
์ฑ๋ฅ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก:
- ํ ์์ ๊ด๋ฆฌํ๋ ์ํ๋ฅผ ๊ฐ๋ฅํ ํ ๊ฐ๊ฒฐํ๊ฒ ์ ์งํฉ๋๋ค.
- ๋น์ผ ๊ณ์ฐ ๋๋ ๋ฐ์ดํฐ ๋ณํ์ ๋ฉ๋ชจํฉ๋๋ค.
- ๋น๋๊ธฐ ์์ ์์ฒด๊ฐ ํจ์จ์ ์ธ์ง ํ์ธํฉ๋๋ค.
React์์ ์ ์ธ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฏธ๋
experimental_useActionState์ ๋์
์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ฌํญ ๋ฐ ์๋ฒ ์ํธ ์์ฉ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ณด๋ค ์ ์ธ์ ์ด๊ณ ๊ฐ์ํ๋ ์ ๊ทผ ๋ฐฉ์์ ๋ํ React์ ๋ ๊ด๋ฒ์ํ ์ถ์ธ๋ฅผ ๋ํ๋
๋๋ค. ์ด๋ React Server Components ๋ฐ Server Actions ์ ์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ง์์ ์ธ ๊ฐ๋ฐ๊ณผ ์ผ์นํ๋ฉฐ ํ ์คํ ๊ฐ๋ฐ ๊ฒฝํ์ ๊ฐ์ํํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค.
์ด๋ฌํ ์คํ์ ๊ธฐ๋ฅ์ด ์ฑ์๋๊ณ ์์ ํ๋จ์ ๋ฐ๋ผ ๋ํํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐฉ์์ ํฌ๊ฒ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ๊ฐ๋ฐ์๋ ์ด๋ฌํ ๊ฐ๋ ฅํ ์๋ก์ด ๊ธฐ๋ณธ ์์๋ฅผ ํ์ฉํ์ฌ ๋ ๊ฐ๋ ฅํ๊ณ ์ฑ๋ฅ์ด ๋ฐ์ด๋๋ฉฐ ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅํ UI๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
์ ์ธ๊ณ ๊ฐ๋ฐ์์ ๊ฒฝ์ฐ ์ด๋ฌํ ์๋ก์ด ํจํด์ ์กฐ๊ธฐ์ ์์ฉํ๋ฉด ๊ฒฝ์ ์ฐ์๋ฅผ ํ๋ณดํ๊ณ ๋ ํจ์จ์ ์ด๊ณ ์ฆ๊ฑฐ์ด ๊ฐ๋ฐ ์ํฌํ๋ก๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ๋น๋๊ธฐ ์์ ๊ณผ ์๋ฒ ์ํ๋ฅผ ์ ์ธ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ดํดํ๋ ๊ฒ์ ์ค์์ฑ์ด ์ฆ๊ฐํ ๊ธฐ์ ์ ๋๋ค.
๊ฒฐ๋ก
React์ experimental_useActionState ํ ์ ๋น๋๊ธฐ ์์ ๋ฐ ์๋ฒ ๋ณ๊ฒฝ ์ฌํญ ๊ด๋ฆฌ๋ฅผ ๋จ์ํํ๋ ๋ฐ ์์ด ์ค์ํ ์ง์ ์ ๋ํ๋ ๋๋ค. ๋ณด๋ฅ, ์ฑ๊ณต ๋ฐ ์ค๋ฅ ์ํ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์ ์ธ์ ํจํด์ ์ ๊ณตํ์ฌ ์์ฉ๊ตฌ ์ฝ๋๋ฅผ ์ค์ด๊ณ ๊ฐ๋ฐ์ ๊ฒฝํ์ ํฅ์์ํต๋๋ค. ์์ ์ฒ๋ฆฌ๋ฅผ ๊ฐ์ํํ๊ณ Server Components์ ๊ฐ์ ์๋ก์ด React ๊ธฐ๋ฅ๊ณผ ์ํํ๊ฒ ํตํฉํ ์ ์๋ ์ ์ฌ๋ ฅ์ ์ด ํ ์ ๋ฉด๋ฐํ ์ฃผ์ํด์ผ ํฉ๋๋ค.
์คํ์ ์ด์ง๋ง ํต์ ๋ ํ๊ฒฝ ๋๋ ์๋ก์ด ํ๋ก์ ํธ์์ ์ด๋ฅผ ์ฑํํ๋ฉด ๊ท์คํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํ๊ณ ๋ ํจ์จ์ ์ด๊ณ ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅํ React ์ ํ๋ฆฌ์ผ์ด์
์ ์ํ ๊ธธ์ ์ด ์ ์์ต๋๋ค. React ์ํ๊ณ๊ฐ ์ง์์ ์ผ๋ก ํ์ ํจ์ ๋ฐ๋ผ experimental_useActionState์ ๊ฐ์ ๋๊ตฌ๋ ๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ํ ์ฐจ์ธ๋ ๋ํํ ์น ๊ฒฝํ์ ๊ตฌ์ถํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํ ๊ฒ์
๋๋ค.
๊ฐ๋ฐ์๊ฐ ์ด ํ
์ ์คํํ๊ณ , ๋์์ค๋ฅผ ์ดํดํ๊ณ , ๊ฐ๋ฐ์ ๊ธฐ์ฌํ๋๋ก ๊ถ์ฅํฉ๋๋ค. React ์ํ ๊ด๋ฆฌ์ ๋ฏธ๋๋ ์ ์ ๋ ์ ์ธ์ ์ผ๋ก ๋ณํ๊ณ ์์ผ๋ฉฐ experimental_useActionState๋ ์ด๋ฌํ ํผ์ฆ์ ํต์ฌ ์กฐ๊ฐ์
๋๋ค.